package com.fansl.koala.quickdev.module.users.controller;


import org.springframework.web.bind.annotation.RequestMapping;

import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.RestController;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fansl.koala.quickdev.common.bean.PageBean;
import com.fansl.koala.quickdev.common.bean.R;
import com.fansl.koala.quickdev.common.constants.CommonConstants;
import com.fansl.koala.quickdev.module.users.entity.SysRoleMenu;
import com.fansl.koala.quickdev.module.users.service.ISysRoleMenuService;
import com.fansl.koala.quickdev.module.users.vo.SysRoleMenuVo;
import com.fansl.koala.quickdev.module.users.bean.dto.SysRoleMenuDTO;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 角色菜单表 前端控制器
 * </p>
 *
 * @author fansl
 * @since 2020-04-08
 */
@RestController
@AllArgsConstructor
@RequestMapping("/users/sys-role-menu")
public class SysRoleMenuController {
    private final ISysRoleMenuService sysRoleMenuService;

    /**
    * 添加
    * @param sysRoleMenuDTO 参数
    * @return true/false
    */
    @PostMapping("")
    public Mono<R<Boolean>> add(@RequestBody SysRoleMenuDTO sysRoleMenuDTO) {
        SysRoleMenu sysRoleMenu = sysRoleMenuDTO2Bean(sysRoleMenuDTO);
        boolean b = sysRoleMenuService.save(sysRoleMenu);
        return Mono.just(R.ok(b));
    }

    /**
    * 根据主键更新
    * @param sysRoleMenuDTO 参数
    * @return true/false
    */
    @PutMapping("")
    public Mono<R<Boolean>> updateById(@RequestBody SysRoleMenuDTO sysRoleMenuDTO) {
        SysRoleMenu sysRoleMenu = sysRoleMenuDTO2Bean(sysRoleMenuDTO);
        boolean b = sysRoleMenuService.updateById(sysRoleMenu);
        return Mono.just(R.ok(b));
    }

    /**
    * 根据主键获取信息
    * @param id 主键
    * @return 查询数据
    */
    @GetMapping("/{id}")
    public Mono<R<SysRoleMenuVo>> getById(@PathVariable Long id) {
        SysRoleMenu sysRoleMenu = sysRoleMenuService.getById(id);
        SysRoleMenuVo sysRoleMenuVo = sysRoleMenu2Vo(sysRoleMenu);
        return Mono.just(R.ok(sysRoleMenuVo));
    }

    /**
    * 根据主键删除
    * @param id 主键
    * @return true/false
    */
    @DeleteMapping("/{id}")
    public Mono<R<Boolean>> delById(@PathVariable Long id) {
       boolean b = sysRoleMenuService.removeById(id);
       return Mono.just(R.ok(b));
    }

    /**
    * 分页查询
    * @param page 分页询参数
    * @param sysRoleMenu 查询参数
    * @return 查询数据
    */
    @GetMapping("/page")
    public Mono<R<PageBean<SysRoleMenuVo>>> page(PageBean<SysRoleMenuVo> page, SysRoleMenu sysRoleMenu) {
        //分页参数
        Page<SysRoleMenu> queryPage = new Page<>();
        queryPage.setCurrent(page.getPageNo());
        queryPage.setSize(page.getPageSize());
        if (StrUtil.isNotBlank(page.getSortOrder()) && StrUtil.isNotBlank(page.getSortField())) {
            OrderItem orderItem = new OrderItem();
            orderItem.setAsc(page.getSortOrder().equals(CommonConstants.PAGE_QUERY_ORDER_ASC));
            orderItem.setColumn(StrUtil.toUnderlineCase(page.getSortField()));
            queryPage.setOrders(Collections.singletonList(orderItem));
        }
        //查询
        LambdaQueryWrapper<SysRoleMenu> queryWrapper = Wrappers.lambdaQuery(sysRoleMenu);
        Page<SysRoleMenu> result = sysRoleMenuService.page(queryPage, queryWrapper);
        //结果转vo
        List<SysRoleMenuVo> data = result.getRecords().stream()
            .map(this::sysRoleMenu2Vo)
            .collect(Collectors.toList());
        //转换结果
        page.setData(data);
        page.setTotalCount(result.getTotal());
        page.setTotalPage(result.getPages());
        return Mono.just(R.ok(page));
    }

    /**
    * Vo对象转换
    * @param sysRoleMenu 源对象
    * @return 目标对象
    */
    private SysRoleMenuVo sysRoleMenu2Vo(SysRoleMenu sysRoleMenu){
        SysRoleMenuVo target = new SysRoleMenuVo();
        BeanUtil.copyProperties(sysRoleMenu,target);
        return target;
    }

    /**
    * DTO对象转换
    * @param sysRoleMenuDTO 源对象
    * @return 目标对象
    */
    private SysRoleMenu sysRoleMenuDTO2Bean(SysRoleMenuDTO sysRoleMenuDTO){
        SysRoleMenu target = new SysRoleMenu();
        BeanUtil.copyProperties(sysRoleMenuDTO,target);
        return target;
    }
}
